package demo04;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

/*
 *  Collections下的sort排序方法还可以传递一个参数：
 *      public static <T> void sort(List<T> list, Comparator<? super T>)：将集合中元素按照指定规则排序。
 * 
 *  Comparator和Comparable的区别：
 *      Comparable：自己(this)和别人(参数)进行比较，自己的所在类需要实现Comparable接口，重写比较的规则compareTo方法
 *      Comparator：创建一个比较器对象，让该对象评判比较的规则
 * 
 *  Comparator的排序规则：
 *      升序：return o1 - o2;
 *      降序：return o2 - o1;
 */
public class Demo03Sort {
    public static void main(String[] args) {
        ArrayList<Integer> arrayList = new ArrayList<>();
        Collections.addAll(arrayList, 1, 3, 2);

        System.out.println("排序前：" + arrayList); // [1, 3, 2]
        Collections.sort(arrayList, new Comparator<Integer>() {
            @Override // 重写比较的规则
            public int compare(Integer o1, Integer o2) {
                // return o1 - o2; // 升序
                return o2 - o1; // 降序
            }
        });
        System.out.println("排序后：" + arrayList); // [3, 2, 1]

        ArrayList<Person> arrayList2 = new ArrayList<>();
        Collections.addAll(arrayList2, new Person("土司鸡", 18), new Person("老虎", 20), new Person("粹花", 1),
                new Person("提莫", 20));

        System.out.println("排序前：" + arrayList2); // [Person [age=18, name=土司鸡], Person [age=20, name=老虎], Person [age=1,
                                                 // name=粹花], Person [age=20, name=提莫]]
        Collections.sort(arrayList2, new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                // return o1.getAge() - o2.getAge(); // 年龄按升序排序
                // return o2.getAge() - o1.getAge(); // 年龄按降序排序

                // 该排序可以自定义更多规则，比如年龄相同的情况下，可以比较姓名的首字符
                int i = o1.getAge() - o2.getAge();
                if (i == 0) { // 年龄相同
                    i = o1.getName().charAt(0) - o2.getName().charAt(0); // 比较姓名的首字符
                }
                return i;
            }
        });
        System.out.println("排序后：" + arrayList2); // [Person [age=1, name=粹花], Person [age=18, name=土司鸡], Person [age=20,
                                                 // name=提莫], Person [age=20, name=老虎]]

        System.out.println((int) '提'); // 25552
        System.out.println((int) '老'); // 32769，老>提，因此排序时提莫在前，老虎在后
    }
}
